package com.gsk.europepharma.salesReport.struts.actions;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.json.JSONObject;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;

import com.gsk.europepharma.salesReport.hibernate.tbSpBoSRSalesSecto;
import com.gsk.europepharma.salesReport.hibernate.tbSpBoSRSalesUga;
import com.gsk.europepharma.salesReport.hibernate.dao.tbSpBoSRSectoDAO;
import com.gsk.europepharma.salesReport.utils.MixProduit;
import com.gsk.europepharma.salesReport.utils.Produit;
import com.gsk.europepharma.salesReport.utils.UtilsSalesReport;

/**
 * Gestion des donnees pour le graphe dynamique.
 */
public class DataDynamic extends Action {

	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		// Variables de session
		HttpSession sessionObject = request.getSession();
		Integer cs_adm_pdt = (Integer) sessionObject.getAttribute("cs_adm_pdt");
		Integer cs_adm_rgpt = (Integer) sessionObject.getAttribute("cs_adm_rgpt");
		if (request.getParameter("product") != null) {
			cs_adm_rgpt = Integer.parseInt(request.getParameter("product"));
		}
		Integer cs_adm_prstn = (Integer) sessionObject.getAttribute("cs_adm_prstn");
		Integer cs_network = (Integer) sessionObject.getAttribute("cs_network");
		// Integer cs_month = (Integer) sessionObject.getAttribute("cs_month");
		// Fin de session  
		
		String idGeog = request.getParameter("idGeog");
		Integer idGeogInteger = Integer.parseInt(idGeog);
		
		String nivGeog = request.getParameter("nivGeog"); 
		
		String source = request.getParameter("source");
		Integer CS_SRC = Integer.parseInt(source);
		
		String unite = request.getParameter("unite");
		String periode = request.getParameter("periode");

		// Parametrage specifique au graphe 
		String indicateur = request.getParameter("indicateur");
		String periodeMarche = request.getParameter("periodeMarche");
		if (periodeMarche.equals("")) {
			periodeMarche = "MM";
		}
		
		tbSpBoSRSectoDAO salesDAO = new tbSpBoSRSectoDAO();
		Session session = salesDAO.getSession();
		
		Query req;
		String strReq = "";
		
		HashMap hm = new HashMap();

		ArrayList dataMarche = new ArrayList();
		Map<String, List<Double>> mapProduits = new HashMap<String, List<Double>>();
		Map<String, String> mapProduitsColor = new HashMap<String, String>();
		Map<String, String> mapProduitsType = new HashMap<String, String>();
		MixProduit mixProduit = (MixProduit) sessionObject.getAttribute("mixProduit");
		int i=0;
		if (mixProduit != null && mixProduit.getProduits() != null) {
			for (Produit produit : mixProduit.getProduits()) {
				// Requete pour chaque produit checked
				if (produit.getChecked()) {
					if (nivGeog.equals("UGA")) {
						strReq = salesDAO.QUERY_GRAPH_DYNAMIC_UGA;
						req = session.createSQLQuery(session.getNamedQuery(strReq).getQueryString());
					} else {
						strReq = salesDAO.QUERY_GRAPH_DYNAMIC_SECTO;
						req = session.createSQLQuery(session.getNamedQuery(strReq).getQueryString());
					}
					
					req.setParameter("data", unite + periode);
					
					req.setParameter("dataM", unite + periodeMarche); 
					
					req.setParameter("cs_adm_pdt", cs_adm_pdt);
					req.setParameter("cs_adm_rgpt", produit.getIdRgpt());
					req.setParameter("cs_adm_prstn", produit.getIdPrstn());
					req.setParameter("CS_SRC", CS_SRC);
					req.setParameter("idGeog", idGeogInteger);
					if (!nivGeog.equals("UGA")) {
						req.setParameter("cs_network", cs_network);
						req.setParameter("nivGeog", nivGeog);		
					}
					
					ArrayList result = new ArrayList(req.list());
					Iterator iter = result.iterator();
					ArrayList dataProduit = new ArrayList();

					while (iter.hasNext()) {
						Object[] val = (Object[]) iter.next();
						
						//Double pm = UtilsSalesReport.getPm(Double.parseDouble(val[1].toString()), Double.parseDouble(val[3].toString()), 1);
						Double indicateurValue = UtilsSalesReport.getIndicateur(
								indicateur, 
								Double.parseDouble(val[1].toString()), 
								Double.parseDouble(val[2].toString()), 
								Double.parseDouble(val[3].toString()), 
								Double.parseDouble(val[4].toString()), 
								1);
						
						dataProduit.add(indicateurValue);	
						
						if (i == 0) {
							Double marche = UtilsSalesReport.getMarche(Double.parseDouble(val[6].toString()), 1) / 1000;
							dataMarche.add(marche);
						}
						
						produit.setType(val[5].toString());
					}
					
					mapProduits.put(produit.getLibelle(), dataProduit);
					String color = "#FF0000";
					if (produit.getColor() != null && !produit.getColor().equals("")) {
						color = produit.getColor();
					}
					mapProduitsColor.put(produit.getLibelle(), color);
					mapProduitsType.put(produit.getLibelle(), produit.getType());
					i++;
					// Fin de la requete pour le produit
				}
			}
		}
		
		// Recuperation PM France et Marche
		strReq = salesDAO.QUERY_GRAPH_DYNAMIC_SECTO;
		req = session.createSQLQuery(session.getNamedQuery(strReq).getQueryString());
		
		req.setParameter("data", unite + periode);
		
		req.setParameter("dataM", unite + periodeMarche);
		
		req.setParameter("cs_adm_pdt", cs_adm_pdt);
		req.setParameter("cs_adm_rgpt", cs_adm_rgpt);
		req.setParameter("cs_adm_prstn", cs_adm_prstn);
		req.setParameter("CS_SRC", CS_SRC);
		req.setParameter("idGeog", idGeogInteger);
		req.setParameter("cs_network", cs_network);
		req.setParameter("nivGeog", "France");
		
		ArrayList result = new ArrayList(req.list());
		Iterator iter = result.iterator();
		ArrayList dataFrance = new ArrayList();
		ArrayList categ = new ArrayList();
		while (iter.hasNext()) {
			Object[] val = (Object[]) iter.next();
			//Double pm = UtilsSalesReport.getPm(Double.parseDouble(val[1].toString()), Double.parseDouble(val[3].toString()), 1);
			
			Double indicateurValue = UtilsSalesReport.getIndicateur(
					indicateur, 
					Double.parseDouble(val[1].toString()), 
					Double.parseDouble(val[2].toString()), 
					Double.parseDouble(val[3].toString()), 
					Double.parseDouble(val[4].toString()), 
					1);
			
			categ.add(val[0].toString().replaceAll("û", "u").replaceAll("é", "e"));
			
			dataFrance.add(indicateurValue);
		}
		
		hm.put("mapProduits", mapProduits);
		hm.put("mapProduitsColor", mapProduitsColor);
		hm.put("mapProduitsType", mapProduitsType);
		hm.put("categ", categ);
		hm.put("dataMarche", dataMarche);
		hm.put("dataFrance", dataFrance);

		JSONObject json = JSONObject.fromObject(hm);

		response.addHeader("Content-Type", "application/json");
        response.getOutputStream().write(json.toString().getBytes("UTF-8"));
        response.getOutputStream().flush();

		return null;
	}
	

	
}
